// 636. [16进制无符号排序]单板告警统计
// https://oj.rnd.huawei.com/problems/636/details
// map<long, string, Cmp_Greater> mapA; Cmp_Greater需要重新实现 long 4 Bytes
// map的比较函数 map<unsigned long, string, Cmp_Greater> mapA;
// 需要重新实现,否则是整形排序.
//假设某系统中有两块单板，这两块单板上产生的告警ID（以十六进制字符串表示）分别存储在列表
// arrayA 和列表arrayB 中。
//请统计并输出系统中的所有告警ID（即arrayA和arrayB的并集）：
//如果告警ID存在重复，先需去重。
//然后以告警ID所表示值的升序排序输出
//输入 第一行1个整数，表示告警列表arrayA的长度，取值范围为：[0,1000]
//第二行表示告警列表arrayA的数据，告警ID以单空格分隔
//第三行1个整数，表示告警列表arrayB的长度，取值范围为：[0,1000]
//第四行表示告警列表arrayB的数据，告警ID以单空格分隔
//告警ID为无符号整数，以十六进制字符串表示，由数字字符、大写字母A~F组成，固定为
// 8 个字符。 输出 按升序排序的告警ID，以单空格分隔 输入 2 00001001 00ABCD00
// 3
// FFFFFAAB FFFFFAAB 00ABCD00
//输出 [00001001 00ABCD00 FFFFFAAB]
//系统中共有三个告警ID：
// 00ABCD00，去重后保留一个；
// FFFFFAAB，去重后保留一个；
// 00001001，只有一个。
//按所表示值的大小升序排列，输出这三个告警ID为 [00001001 00ABCD00 FFFFFAAB] 。
//输入 0
// 1
// FFFFFAAB
//输出 [FFFFFAAB]
#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;

//#define DEBUG
#ifdef DEBUG
#define PF(...) printf(__VA_ARGS__)
#else
#define PF(...)
#endif

class Solution {
 public:
  // 待实现函数，在此函数中填入答题代码;
  struct Board {
    unsigned long uId = 0;
    string idstr;
  };
  struct Cmp_Greater {
    bool operator()(unsigned long uid1, unsigned long uid2) const {
      return uid1 < uid2;
    }
  };
  vector<string> GetAllFault(const vector<string> &arrayA,
                             const vector<string> &arrayB) {
    //        map<int, string, Cmp_Greater> mapA;
    map<unsigned long, string> mapA;
    for (auto bd : arrayA) {
      PF("---- %s\n", bd.c_str());
      unsigned long uId = stoul(bd, 0, 16);
      PF("%lu, %s\n", uId, bd.c_str());
      mapA.insert({uId, bd});
    }
    for (auto bd : arrayB) {
      PF("---- %s\n", bd.c_str());
      unsigned long uId = stoul(bd, 0, 16);
      PF("%lu, %s\n", uId, bd.c_str());
      mapA.insert({uId, bd});
    }

    vector<string> result;
    for (auto db : mapA) {
      result.push_back(db.second);
    }
    return result;
  }
};

inline int ReadInt() {
  int number;
  std::cin >> number;
  return number;
}

template <typename T>
inline std::vector<T> ReadVector(int size) {
  std::vector<T> objects(size);
  for (int i = 0; i < size; ++i) {
    std::cin >> objects[i];
  }
  return objects;
}

template <typename T>
inline void WriteVector(const std::vector<T> &objects, char delimeter = ' ') {
  auto it = objects.begin();
  if (it == objects.end()) {
    return;
  }
  std::cout << *it;
  for (++it; it != objects.end(); ++it) {
    std::cout << delimeter << *it;
  }
}

int main() {
  int d = stoi("00ABCD00", 0, 16);
  PF("%d\n", d);
  PF("sizeof unsigned long=%d\n", sizeof(unsigned long));
  int arrayANum = ReadInt();
  vector<string> arrayA = ReadVector<string>(arrayANum);
  int arrayBNum = ReadInt();
  vector<string> arrayB = ReadVector<string>(arrayBNum);

  Solution solu;
  auto result = solu.GetAllFault(arrayA, arrayB);
  cout << "[";
  WriteVector(result, ' ');
  cout << "]" << endl;
  return 0;
}
